﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using LTorrent.Torrent.File;

namespace LTorrent.Torrent.BEncode
{
    #region FileBEncoding

    public class FileBEncoding
    {
        public List<BElement> BenItems;//Если подразумеваем только один элемент на файл, то пишем BElement BenItem

        BElement this[int index]
        {
            get
            {
                if (BenItems.Count > index)
                    return BenItems[index];
                return null;
            }
            set
            {
                if (BenItems.Count > index)
                {
                    BenItems[index] = value;
                }
                else throw new Exception("Выход за пределы. Ничего не записано");
            }
        }
        public FileBEncoding(Stream Strm)
        {//TODO можно для простоты перевести BenItems в BElement;
            var Reader = new BinaryReader(Strm, Encoding.ASCII);
            BenItems = new List<BElement>();
            BElement temp = BElement.Deserialize(Reader);
            if (temp != null)
                BenItems.Add(temp);
            else throw new Exception("Не корректный ответ трекера");
        }

        public FileBEncoding(string Path)
        {
            if (!System.IO.File.Exists(Path)) return;
            BenItems = new List<BElement>();
            var mStream = new FileStream(Path, FileMode.Open);
            BinaryReader Reader = new BinaryReader(mStream, Encoding.ASCII);
            //           while (!Reader.EndOfStream)
            //         {
            BElement temp = BElement.Deserialize(Reader);
            if (temp != null)
                BenItems.Add(temp);
            else throw new Exception("Не корректный или поврежденный файл!");
            //       }
            Reader.Close();
        }
    #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////



        #region StringBuild

        private string BElementToSTR(BElement CurrentElement, int TabCount, bool Ignore = true)
        {
            //для корректной обработки некорректных файлов
            if (CurrentElement == null) return "";//Так как выше по ходу, при неверное структуре файла не выдавали исключение. 

            string Result = "";//строка результата
            if (Ignore)//табуляция строки для словаря не нужна
                PasteTab(ref Result, TabCount);
            if (CurrentElement.STDItem != null)
            {
                Result += CurrentElement.STDItem.ToString();
                return Result;
            }
            if (CurrentElement.LSTItem != null)
            {//обработка списка
                Result += "List{\n";
                for (int i = 0; i < CurrentElement.LSTItem.Count; i++)
                    Result += BElementToSTR(CurrentElement.LSTItem[i], TabCount + 1) + '\n';
                PasteTab(ref Result, TabCount);
                Result += "}List\n";
                return Result;
            }
            if (CurrentElement.DICItem != null)
            {//обработка словаря
                Result += "Dict{\n";
                for (int i = 0; i < CurrentElement.DICItem.Count; i++)
                {
                    Result += BElementToSTR(CurrentElement.DICItem[i][0], TabCount + 1) + " => " + BElementToSTR(CurrentElement.DICItem[i][1], TabCount + 1, false) + '\n';
                }
                PasteTab(ref Result, TabCount);
                Result += "}Dict\n";
                return Result;
            }
            return "";//Если все элементы null, то возвратим пустую строку
        }

        private string PasteTab(ref string STR, int count)
        {//табуляция
            for (int i = 0; i < count; i++)
                STR += '\t';
            return STR;
        }

        public string ToString()
        {
            string Result = "";
            for (int i = 0; i < BenItems.Count; i++)
            {
                Result += BElementToSTR(BenItems[i], 0) + "\n\n";
            }
            return Result;
        }
        #endregion




    }
}
